// jwt
package jwt

import (
	"fmt"
	"time"

	"gitee.com/copylian/lian-go.git/constant"
	"gitee.com/copylian/lian-go.git/entity"

	"gitee.com/copylian/lian-go.git/helper/strings"

	"github.com/dgrijalva/jwt-go"
)

// GenerateToken 生成jwt token
func GenerateToken(claimData entity.ClaimData, jwtConfig *entity.JwtConfig) string {
	// 如果有传入数据则使用数据，否则使用默认
	jwtConfig = GetJwtConfig(jwtConfig)

	// jwt配置信息
	duration, _ := time.ParseDuration(fmt.Sprintf("%vs", jwtConfig.JwtTTL))
	claimData.StandardClaims = jwt.StandardClaims{
		ExpiresAt: time.Now().Add(duration).Unix(), // 过期时间
		IssuedAt:  time.Now().Unix(),               // 生效时间
		NotBefore: time.Now().Unix(),               // 签发时间
	}

	// 实例化
	t := jwt.NewWithClaims(jwt.SigningMethodHS256, claimData)
	token, _ := t.SignedString(strings.StrToBytes(jwtConfig.JwtSecret))

	// 返回
	return token
}

// ParseToken 解析
func ParseToken(tokenString string, jwtConfig *entity.JwtConfig) (*entity.ClaimData, error) {
	// 如果有传入数据则使用数据，否则使用默认
	jwtConfig = GetJwtConfig(jwtConfig)

	// 解析token
	token, err := jwt.ParseWithClaims(tokenString, &entity.ClaimData{}, func(token *jwt.Token) (interface{}, error) {
		return strings.StrToBytes(jwtConfig.JwtSecret), nil
	})

	// 验证
	claims, ok := token.Claims.(*entity.ClaimData)
	if !ok || !token.Valid {
		return nil, err
	}

	// 返回
	return claims, nil
}

// GetJwtConfig 获取jwt配置
func GetJwtConfig(jwtConfig *entity.JwtConfig) *entity.JwtConfig {
	if len(jwtConfig.JwtSecret) == 0 || jwtConfig.JwtTTL == 0 {
		jwtConfig = &entity.JwtConfig{
			JwtSecret: constant.JwtSecret, // jwt密匙
			JwtTTL:    constant.JwtTTL,    // jwt过期时间(秒)
		}
	}
	return jwtConfig
}
